import unittest

# 安装pywin32后可以引用下面3个包
import win32api
import win32con
import win32gui

import time


class TestPyWin32(unittest.TestCase):

    """
    功能：显示提示消息
    """
    def test_show_messageBox(self):
        win32api.MessageBox(win32con.NULL, 'Python 您好！', '您好', win32con.MB_OK)

    """
    功能：打开记事本
    """
    def test_open_notepad(self):
        win32api.ShellExecute(0, "open", "notepad.exe", "", "", 1)

    """
    功能：打开记事本并输入内容
    """
    def test_find_notepad_and_input(self):
        # 打开记事本
        win32api.ShellExecute(0, "open", "notepad.exe", "", "", 1)

        # 等待记事本窗口打开
        time.sleep(1)

        # 寻找记事本窗口
        notepad = win32gui.FindWindow("Notepad", None)

        # 若为非 0 的值，代表有找到窗口
        if notepad != 0:
            # 设置记事本标题
            win32gui.SendMessage(notepad, win32con.WM_SETTEXT, None, "Hello")

            # 寻找输入文字的地方
            edit = win32gui.FindWindowEx(notepad, None, "Edit", None)

            # 输入文字
            win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, "您好！Pythonn1")
            time.sleep(1)
            win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, "您好！Pythonn2")

    """
    功能：测试获取所有活动窗口的句柄
    """
    def test_get_all_process(self):
        hWnd_list = Win32Util.get_all_windows()
        print(hWnd_list)
        for item in hWnd_list:
            title = Win32Util.get_title(item)
            class_name = Win32Util.get_class_name(item)
            print('窗口标题:%s, 窗口类名: %s' % (title, class_name))

    def test_util(self):
        Win32Util.show_win("微信")
        time.sleep(3)
        Win32Util.hide_win("微信")


class Win32Util:

    """
    功能：获取所有窗口
    """
    def get_all_windows():
        hWnd_list = []
        win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWnd_list)
        return hWnd_list

    """
    功能：根据句柄获取窗口标题
    参数：
    - hwnd：句柄
    返回值：标题
    """
    def get_title(hwnd):
        title = win32gui.GetWindowText(hwnd)
        return title

    """
    功能：根据句柄获取窗口classname
    参数：
    - hwnd：句柄
    返回值：窗口classname
    """
    def get_class_name(hwnd):
        class_name = win32gui.GetClassName(hwnd)
        return class_name

    """
    功能：获取窗口的所有子窗口句柄
    """
    def get_son_windows(parent):
        hWnd_child_list = []
        win32gui.EnumChildWindows(parent, lambda hWnd, param: param.append(hWnd), hWnd_child_list)
        return hWnd_child_list

    """
    功能：根据句柄置顶窗口
    """
    def set_top(hwnd):
        win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0,
                              win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE | win32con.SWP_NOOWNERZORDER | win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE)

    """
    功能：根据句柄取消置顶
    """
    def set_down(hwnd):
        win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0,
                              win32con.SWP_SHOWWINDOW | win32con.SWP_NOSIZE | win32con.SWP_NOMOVE)

    """
    功能：根据窗口title获取句柄
    """
    def get_hwnd_from_name(name):
        hWnd_list = Win32Util.get_all_windows()
        for hwd in hWnd_list:
            title = Win32Util.get_title(hwd)
            if title == name:
                return hwd

    """
    功能：根据窗口title显示窗口
    """
    def show_win(name):
        hwd = Win32Util.get_hwnd_from_name(name)
        win32gui.ShowWindow(hwd, win32con.SW_SHOW)

    """
    功能：根据窗口title隐藏窗口
    """
    def hide_win(name):
        hwd = Win32Util.get_hwnd_from_name(name)
        win32gui.ShowWindow(hwd, win32con.SW_HIDE)

if __name__ == '__main__':
    unittest.main()
